package minijava.Util;

import java.util.LinkedList;

public class List<Type> {
    public Type cabeca;
    public List<Type> calda;

    public List(Type cabeca,List<Type> calda)
    {
        if(cabeca != null)
        {
            this.cabeca = cabeca;
            this.calda = calda;
        }
    }

    public int length()
    {
        List<Type> aux = this;
        int length = 0;
        while(aux != null)
        {
            aux = aux.calda;
            length++;
        }
        return length;
    }

    public Type getAt(int index)
    {
        int i=0;
        List<Type> aux = this;

        if(index > this.length())
        {
            System.out.println("Indice nao existe na lista");
            //Enviar excecoes depois
            return null;
        }

        while(i <= index)
        {
            if(i == index) return aux.cabeca;
            aux = aux.calda;
            i++;
        }

        return null;
    }

    //Insere sempre no final da lista
    public void insert(Type novoNo)
    {
        List<Type> aux = this;
        LinkedList<Type> linkedList = new LinkedList();
        while(aux != null)
        {
            linkedList.addLast(aux.cabeca);
            aux = aux.calda;
        }

        copy(linkedList,this);
    }

    private void copy(LinkedList<Type> linkedList,List<Type> list)
    {
        if(!linkedList.isEmpty())
        {
            list.cabeca = linkedList.removeFirst();
            //Vai montando a calda recursivamente
            copy(linkedList,list.calda);
        }
    }

}
